use fluviox_shared::{FluvioManager, models::FluvioTopic};

#[tokio::test]
async fn test_fluvio_manager_creation() {
    // 测试FluvioManager的创建（不需要真实的Fluvio集群）
    // 这个测试会失败，但我们可以验证代码结构是否正确
    
    let result = FluvioManager::new("localhost:9003").await;
    
    // 在没有Fluvio集群的情况下，这应该失败
    // 但我们可以验证错误类型是否正确
    match result {
        Ok(_) => {
            // 如果成功，说明有Fluvio集群运行
            println!("✅ Fluvio集群连接成功");
        }
        Err(e) => {
            // 预期的错误，因为没有运行Fluvio集群
            println!("⚠️ 预期的连接错误（无Fluvio集群）: {}", e);
        }
    }
}

#[test]
fn test_topic_name_validation() {
    use fluviox_shared::fluvio_manager::is_valid_topic_name;
    
    // 测试有效的主题名称
    assert!(is_valid_topic_name("valid-topic"));
    assert!(is_valid_topic_name("valid_topic"));
    assert!(is_valid_topic_name("valid123"));
    assert!(is_valid_topic_name("a"));
    assert!(is_valid_topic_name("test-topic-123"));
    
    // 测试无效的主题名称
    assert!(!is_valid_topic_name(""));
    assert!(!is_valid_topic_name("invalid topic")); // 包含空格
    assert!(!is_valid_topic_name("invalid.topic")); // 包含点
    assert!(!is_valid_topic_name("invalid@topic")); // 包含特殊字符
    assert!(!is_valid_topic_name("invalid/topic")); // 包含斜杠
}

#[test]
fn test_fluvio_topic_model() {
    let topic = FluvioTopic {
        name: "test-topic".to_string(),
        partitions: 3,
        replication_factor: 1,
        retention_time: Some(86400),
        compression: Some("gzip".to_string()),
    };
    
    assert_eq!(topic.name, "test-topic");
    assert_eq!(topic.partitions, 3);
    assert_eq!(topic.replication_factor, 1);
    assert_eq!(topic.retention_time, Some(86400));
    assert_eq!(topic.compression, Some("gzip".to_string()));
}

#[tokio::test]
async fn test_fluvio_manager_mock_operations() {
    // 这个测试验证我们的API结构是否正确
    // 即使没有真实的Fluvio集群，我们也可以测试代码结构
    
    // 测试主题名称验证
    use fluviox_shared::fluvio_manager::is_valid_topic_name;
    
    let valid_names = vec![
        "user-events",
        "order_data", 
        "metrics123",
        "logs",
    ];
    
    for name in valid_names {
        assert!(is_valid_topic_name(name), "主题名称 '{}' 应该是有效的", name);
    }
    
    println!("✅ 主题名称验证测试通过");
}

#[test]
fn test_project_structure() {
    // 验证项目结构是否正确
    assert!(std::path::Path::new("backend/shared/src/fluvio_manager.rs").exists());
    assert!(std::path::Path::new("backend/api-gateway/src/main.rs").exists());
    assert!(std::path::Path::new("frontend/package.json").exists());
    assert!(std::path::Path::new("docker-compose.yml").exists());
    
    println!("✅ 项目结构验证通过");
}

#[test]
fn test_configuration_structure() {
    use fluviox_shared::Config;
    
    // 测试配置结构是否正确
    let config = Config {
        server: fluviox_shared::config::ServerConfig {
            host: "localhost".to_string(),
            port: 8080,
            cors_origins: vec!["http://localhost:3000".to_string()],
        },
        database: fluviox_shared::config::DatabaseConfig {
            url: "postgresql://test".to_string(),
            max_connections: 10,
            min_connections: 1,
        },
        fluvio: fluviox_shared::config::FluvioConfig {
            cluster_endpoint: "localhost:9003".to_string(),
            default_partitions: 1,
            default_replication: 1,
        },
        ai: fluviox_shared::config::AiConfig {
            openai_api_key: None,
            model: "gpt-3.5-turbo".to_string(),
            max_tokens: 1000,
        },
    };
    
    assert_eq!(config.server.host, "localhost");
    assert_eq!(config.fluvio.cluster_endpoint, "localhost:9003");
    
    println!("✅ 配置结构验证通过");
}
